package com.eds.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class DateTimeUtils {
    //定义了常用的日期时间格式的静态常量
    //TIME_FORMATTER=HH:mm
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
    //DATE_FORMATTER=yyyy-MM-dd
    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    //DATE_TIME_FORMATTER=yyyy-MM-dd HH:mm:ss
    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");


    /* *
     * @Title: parseTime
     * @Author: vvSmile
     * @Date: 2025-03-27 15:05:55
     * @param timeStr
     * @return Date
     * @Description: TODO 解析时间字符串，支持多种格式
     * 主要逻辑：1.判断输入是否为空或无效。
               2. 根据字符串的格式选择不同的解析方式：
                    (1).如果包含 T，则按 ISO 格式解析。
                    (2)如果包含 -，则按 yyyy-MM-dd HH:mm:ss 格式解析。
                    (3)否则按 HH:mm 格式解析。
                3.将解析结果转换为当天的该时间，并返回对应的 Date 对象。
     */
    public static Date parseTime(String timeStr) {
        if (timeStr == null || timeStr.trim().isEmpty()) {
            return null;
        }

        try {
            LocalTime localTime;
            if (timeStr.contains("T")) {
                // 处理ISO格式
                Instant instant = Instant.parse(timeStr);
                ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
                localTime = zonedDateTime.toLocalTime();
            } else if (timeStr.contains("-")) {
                // 处理 yyyy-MM-dd HH:mm:ss 格式
                LocalDateTime dateTime = LocalDateTime.parse(timeStr, DATE_TIME_FORMATTER);
                localTime = dateTime.toLocalTime();
            } else {
                // 处理HH:mm格式
                localTime = LocalTime.parse(timeStr, TIME_FORMATTER);
            }

            // 转换为当天的该时间
            LocalDateTime dateTime = LocalDateTime.of(LocalDate.now(), localTime);
            return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
        } catch (Exception e) {
            throw new IllegalArgumentException("无法解析时间格式: " + timeStr, e);
        }
    }


    /* *
     * @Title: parseDate
     * @Author: vvSmile
     * @Date: 2025-03-27 15:07:58
     * @param dateStr
     * @return Date
     * @Description: TODO 解析日期字符串，支持多种格式
     * 主要逻辑：1.判断输入是否为空或无效。
               2. 根据字符串的格式选择不同的解析方式：
                    (1).如果包含 T，则按 ISO 格式解析。
                    (2)如果包含 -，则按 yyyy-MM-dd HH:mm:ss 格式解析。
                    (3)否则按 HH:mm 格式解析。
                3.将解析结果转换为当天的该时间，并返回对应的 Date 对象。
     */
    public static Date parseDate(String dateStr) {
        if (dateStr == null || dateStr.trim().isEmpty()) {
            return null;
        }

        try {
            LocalDate localDate;
            if (dateStr.contains("T")) {
                // 处理ISO格式
                Instant instant = Instant.parse(dateStr);
                ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault());
                localDate = zonedDateTime.toLocalDate();
            } else if (dateStr.contains(":")) {
                // 处理 yyyy-MM-dd HH:mm:ss 格式
                LocalDateTime dateTime = LocalDateTime.parse(dateStr, DATE_TIME_FORMATTER);
                localDate = dateTime.toLocalDate();
            } else {
                // 处理yyyy-MM-dd格式
                localDate = LocalDate.parse(dateStr, DATE_FORMATTER);
            }

            return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
        } catch (Exception e) {
            throw new IllegalArgumentException("无法解析日期格式: " + dateStr, e);
        }
    }

    //处理2025-12-22
    public static java.sql.Date parseSimpleDate(String dateStr) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date utilDate = sdf.parse(dateStr);
            return new java.sql.Date(utilDate.getTime());
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /* *
     * @Title: parseDateTime
     * @Author: vvSmile
     * @Date: 2025-03-27 15:08:54
     * @param dateTimeStr
     * @return Date
     * @Description: TODO 解析日期时间字符串为Date对象
     * 主要逻辑：1.判断输入是否为空或无效。
               2. 根据字符串的格式选择不同的解析方式：
                    (1).如果包含 T，则按 ISO 格式解析。
                    (2)如果包含 -，则按 yyyy-MM-dd HH:mm:ss 格式解析。
                    (3)否则按 HH:mm 格式解析。
                3.将解析结果转换为当天的该时间，并返回对应的 Date 对象。
     */
    public static Date parseDateTime(String dateTimeStr) {
        if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
            return null;
        }

        try {
            LocalDateTime dateTime;
            if (dateTimeStr.contains("T")) {
                // 处理ISO格式
                Instant instant = Instant.parse(dateTimeStr);
                return Date.from(instant);
            } else {
                // 处理 yyyy-MM-dd HH:mm:ss 格式
                dateTime = LocalDateTime.parse(dateTimeStr, DATE_TIME_FORMATTER);
                return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
            }
        } catch (Exception e) {
            throw new IllegalArgumentException("无法解析日期时间格式: " + dateTimeStr, e);
        }
    }


    /* *
     * @Title: formatTime
     * @Author: vvSmile
     * @Date: 2025-03-27 15:11:17
     * @param date
     * @return String
     * @Description: TODO 格式化时间为HH:mm格式
     * 主要逻辑：
            1.判断输入是否为空。
            2.将 Date 转换为 LocalTime，然后使用 TIME_FORMATTER 格式化为 HH:mm 格式的字符串。
            3.返回格式化后的时间字符串。
     */
    public static String formatTime(Date date) {
        if (date == null) {
            return null;
        }
        LocalTime localTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalTime();
        return localTime.format(TIME_FORMATTER);
    }

    /* *
     * @Title: formatDate
     * @Author: vvSmile
     * @Date: 2025-03-27 15:10:01
     * @param date
     * @return String
     * @Description: TODO 格式化日期为yyyy-MM-dd格式
     * 主要逻辑：
            1.判断输入是否为空。
            2.将 Date 转换为 LocalDate，然后使用 DATE_FORMATTER 格式化为 yyyy-MM-dd 格式的字符串。
            3.返回格式化后的日期字符串。
     */
    public static String formatDate(Date date) {
        if (date == null) {
            return null;
        }
        LocalDate localDate = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDate();
        return localDate.format(DATE_FORMATTER);
    }


    /* *
     * @Title: formatDateTime
     * @Author: vvSmile
     * @Date: 2025-03-27 15:12:06
     * @param date
     * @return String
     * @Description: TODO 格式化日期时间为yyyy-MM-dd HH:mm:ss格式
     * 主要逻辑：
            1.判断输入是否为空。
            2.将 Date 转换为 LocalDateTime，然后使用 DATE_TIME_FORMATTER 格式化为 yyyy-MM-dd HH:mm:ss 格式的字符串。
            3.返回格式化后的日期时间字符串。
     */
    public static String formatDateTime(Date date) {
        if (date == null) {
            return null;
        }
        LocalDateTime localDateTime = date.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime();
        return localDateTime.format(DATE_TIME_FORMATTER);
    }
}